www.gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/Atmosphere.cpp
#include "stdafx.h" #include "Atmosphere.h" //Download by http://www.NewXing.com CAtmosphere::CAtmosphere() { g0=9.806; Ty0=288.15; Rz=6371000; } CAtmosphere::~CAtmosphere() { } /////////// 空军标准大气条件 ////////// //求空军标准大气条件下空气密度 函数 double CAtmosphere::Get_rho_Airforce( double y ) //空军标准大气条件 { rho0=1.225; rho=rho0*pow( 1-2.0323*y/100000, 4.830 ); return rho; } //求空军标准大气条件下声速 函数 double CAtmosphere::GetSONIC_Airforce(double y) { if ( ( y>=0 )&&( y<=13000) ) { Ty=288.34*(1-2.0323e-5*y); SONIC=20.046*sqrt( Ty ); } if ( y>=13000 ) { Ty=212.2; SONIC=20.046*sqrt( Ty ); } return SONIC; } //求空军标准大气条件下马赫数 函数 double CAtmosphere::GetMa_Airforce(double velo, double y) { return velo/GetSONIC_Airforce( y ); } /////////// 炮兵标准大气条件 ////////// //求炮兵标准大气条件下空气密度 函数 double CAtmosphere::Get_rho_Artillery(double y) //炮兵标准大气条件 30公里以上按30公里来算,韩子鹏<<火箭外弹道学>> { rho0 = 1.2063; double pi_y; if ( ( y>=0 )&&( y<9300) ) { Ty=288.9-0.006328*y; pi_y=pow( (1-0.000021904*y), 5.4 ); rho=rho0*pi_y*288.9/Ty; } else if ( ( y>=9300)&&( y<12000) ) { Ty=230-0.006328*(y-9300)+0.000001172*(y-9300)*(y-9300); pi_y=0.2922575*exp( -2.1206426* (atan( (2.344*(y-9300)-6328)/32221.057 )+0.1939252 ) ); rho=rho0*pi_y*288.9/Ty; } else { Ty=221.5; pi_y=0.193725*exp(-(y-12000)/6483.305 ); rho=rho0*pi_y*288.9/Ty; } return rho; } //求炮兵标准大气条件下声速 函数 double CAtmosphere::GetSONIC_Artillery(double y) { double Tyy; if ( ( y>=0 )&&( y<=9300) ) { Tyy=288.9-0.006328*y; } else if ( ( y>9300)&&( y<12000) ) { Tyy=230-0.006328*(y-9300)+0.000001172*(y-9300)*(y-9300); } else { Tyy=221.5; } SONIC=20.047*sqrt( Tyy ); return SONIC; } //求炮兵标准大气条件下马赫数 函数 double CAtmosphere::GetMa_Artillery(double velo, double y) { return velo/GetSONIC_Artillery( y ); } /////////// 美国1976年国家标准大气条件 ////////// //求美国1976年国家标准大气条件下空气密度 函数 double CAtmosphere::Get_rho_USA1976(double y) //美国1976年国家标准大气条件 { double W,T; rho0 = 1.225 ; y=y/1000; if ( ( y>=0 )&&( y<=11.0191) ) { W=1-y/44.3308; //T=288.15; rho=rho0*pow( W, 4.2559 ); } else if ( ( y>11.0191 )&&( y<=20.063 ) ) { W=exp( (14.9647-y)/6.3416 ); //e=2.718281828459; T=216.65; rho=0.15898*rho0*W ; } else if ( ( y>20.063 )&&( y<=32.1619 ) ) { W=1+( y- 24.9021)/221.552 ; T=221.552; rho=0.032722*rho0*pow( W, -35.1629 ) ; } else if ( ( y>32.1619 )&&( y<=47.350 ) ) { W=1+( y- 39.7499)/89.4107 ; T=250.350; rho=0.0032618*rho0*pow( W, -13.2011 ) ; } else if ( ( y>47.350 )&&( y<=51.4125 ) ) { W=exp( (48.6252-y)/7.9223 ); T=270.650; rho=0.0009490*rho0*W ; } else if ( ( y>51.4125 )&&( y<=71.8020 ) ) { W=1+( y- 39.7499)/89.4107 ; T=250.350; rho=0.0032618*rho0*pow( W, 11.2011 ) ; } else if ( ( y>71.8020 )&&( y<=86 ) ) { W=1-( y- 78.0303)/100.2950 ; T=200.590; rho=0.000017632*rho0*pow( W, 16.0816 ) ; } else { W=exp( (87.2848-y)/5.4700 ); T=186.87; rho=0.0000036411*rho0*W ; } return rho; } //求美国1976年国家标准大气条件下声速 函数 double CAtmosphere::GetSONIC_USA1976(double y) { double W,T; y=y/1000; if ( ( y>=0 )&&( y<=11.0191) ) { W=1-y/44.3308; T=288.15*W; } else if ( ( y>11.0191 )&&( y<=20.063 ) ) { W=exp( (14.9647-y)/6.3416 ); //e=2.718281828459; T=216.65; } else if ( ( y>20.063 )&&( y<=32.1619 ) ) { W=1+( y- 24.9021)/221.552 ; T=221.552*W; } else if ( ( y>32.1619 )&&( y<=47.350 ) ) { W=1+( y- 39.7499)/89.4107 ; T=250.350*W; } else if ( ( y>47.350 )&&( y<=51.4125 ) ) { W=exp( (48.6252-y)/7.9223 ); T=270.650; } else if ( ( y>51.4125 )&&( y<=71.8020 ) ) { W=1+( y- 59.4390)/89.2218 ; T=247.021*W; } else if ( ( y>71.8020 )&&( y<=86 ) ) { W=1-( y- 78.0303)/100.2950 ; T=200.590*W; } else { W=exp( (87.2848-y)/5.4700 ); T=186.87; } SONIC=20.0468*sqrt( T ); return SONIC; } //求美国1976年国家标准大气条件下马赫数 函数 double CAtmosphere::GetMa_USA1976(double velo, double y) { return velo/GetSONIC_USA1976( y ); } //////////// 求不同地球模型情况下的重力加速度 //////////// //地球表面为平坦情况下的求g 函数 double CAtmosphere::Get_g_simple( double y ) { g=9.806*(1.0-2.0*y/Rz); return g; } //考虑地球表面形状 球体 但不考虑地球自转影响 求g函数 double CAtmosphere::Get_g_middle(double phi, double y ) { g=9.78034*( 1+0.00528*sin(phi)*sin(phi) )*(1.0-2.0*y/Rz); return g; } //考虑地球表面形状和自转运动模型 求g,gr,g_we函数 double CAtmosphere::Get_g_precision( double r, double phi, double& gr, double& g_we ) { double f,ae,J_2,q; f=398600500000000; ae=6378140; J_2=0.00162395; q=0.0034614; g_we =(-2*f/r/r)*J_2*(ae/r)*(ae/r)*sin(phi); //地球自转we方向的重力加速度分量 gr =(-f/r/r)*(1+J_2*(ae/r)*(ae/r)*(1-5*sin(phi)*sin(phi)) ); //矢径r方向的重力加速度分量 g= (f/r/r)*(1+J_2*(ae/r)*(ae/r)*(1-3*sin(phi)*sin(phi)) -q*(r/ae)*(r/ae)*(r/ae)*cos(phi)*cos(phi) ); //地球重力加速度的合成量绝对值 return g ; }